/* 删除带头节点单链表中所有值为x的结点 */

#include <iostream>
#include "headfun.h"
using namespace std;

// 删除所有x值的结点 -- 方法一，双指针
void del(LNode *&L, int x)
{
  // 分别指向前后两个结点
  LNode *p = L->next, *pre = L;
  
  // 辅助
  LNode *q;
  
  // 遍历链表
  while (p != NULL)
  {
    // 如果结点值为x
    if (p->data == x)
    {
      q = p;
      
      // 构造新链接
      pre->next = p->next;
      p = p->next;
      
      // 释放内存
      free(q);
    }
    
    // 如果值不为x
    else
    {
      // 查看下一个结点
      pre = p;
      p = p->next;
    }
  }
}

// 删除所有x值的结点 -- 方法二，单指针
void Del(LNode *&L, int x)
{
  LNode *p = L;
  
  // 下一个结点不为空
  while (p->next != NULL)
  {
    // 如果下一个结点值为x
    if (p->next->data == x)
    {
      // 指向下一个结点
      LNode *q = p->next;
      
      // 构建新链接
      p->next = q->next;
      
      // 释放内存
      free(q);
    }
    
    // 如果下一个结点值不为x
    else
      p = p->next;
  }
}

int main()
{
  // 带头节点的链表
  LNode *L = head_Linklist();
  
  // 删除10
  Del(L, 10);
  
  // 遍历链表，打印信息
  LNode *q = L->next;
  while (q != NULL)
  {
    cout << q->data << " ";
    q = q->next;
  }
  
  return 0;
}
